{
    let extend = Sail.Utils.extend;
    class Data {
        constructor () {
            this.hero = null;
            this.heroGrade = null;
            this.heroLevel = null;
            this.heroSkin = null;
            this.mapList = null;
            this.entraceData = null;
            this.userGrade = null;
            this.userLevel = null;
            this.userFrame =null;
            this.userIcon = null;
            this.attachment = null;

            this.init();
        }

        init () {
            this.hero = Laya.loader.getRes("data/hero.json").hero;
            this.heroGrade = Laya.loader.getRes("data/hero_grade.json").grade;
            this.heroLevel = Laya.loader.getRes("data/hero_level.json").hero;
            this.heroSkin = Laya.loader.getRes("data/hero_skin.json").hero;
            this.mapList = Laya.loader.getRes("data/map_config.json").map;
            this.entraceData = Laya.loader.getRes("data/mode_rotation.json").mode;
            this.userGrade = Laya.loader.getRes("data/user_grade.json").grade;
            this.userLevel = Laya.loader.getRes("data/user_level.json").level;
            this.userFrame = Laya.loader.getRes("data/user_frame.json").frame;
            this.userIcon = Laya.loader.getRes("data/user_icon.json").icon;
            this.attachment = Laya.loader.getRes("data/attachment.json").icon;
        }

        /**
         * 根据英雄编号获取对应英雄的固定数据，包含战斗及展示
         * @param {Number} id 英雄编号
         */
        getHeroData (id) {
            return extend(true, {}, this.hero[id - 1]) || null;
        }

        /**
         * 获取所有的英雄数据，如果传入已拥有的英雄列表，则返回的数据根据已拥有的在前，未拥有的在后排序。
         * @param {Array} data 已拥有的英雄列表
         */
        getAllHeroData (data) {
            let heroList = extend(true, [], this.hero);
            let userHero = [];
            if(data){
                for(let i = heroList.length - 1; i >= 0; i--){
                    for(let h of data){
                        if(heroList[i].no == h.hero_no){
                            userHero.push(heroList.splice(i, 1)[0]);
                        }
                    }
                }
                userHero = userHero.concat(heroList);
                for(let h of userHero){
                    for(let l of this.heroLevel){
                        if(h.no == l.no){
                            h.max = extend(true, {}, l.max);
                        }
                    }
                }
                return userHero;
            }else{
                return heroList;
            }
        }

        /**
         * 根据英雄的军阶等级获取对应军阶的数据
         * @param {Number} level 军阶等级
         */
        getHeroGrade (grade) {
            return extend(true, {}, this.heroGrade[grade - 1]) || null;
        }

        /**
        * 根据英雄的no获取对应等级的数据
        * @param {Number} no id
        */
        getHeroLevel (no) {
            return extend(true, {}, this.heroLevel[no - 1]) || null;
        }

        /**
         * 根据英雄编号和皮肤编号获取英雄的皮肤数据
         * @param {Number} heroId 英雄编号
         * @param {Number} skinId 皮肤编号 1-3
         */
        getHeroSkin (heroId, skinId) {
            return extend(true, {}, this.heroSkin[heroId - 1].skin[skinId - 1]) || null;
        }

        /**
         * 根据地图编号获取地图相应的数据，包含地图文件夹名，地图简介，地图名称等等
         * @param {Number} mapId 地图编号
         */
        getMapInfo (mapId) {
            return extend(true, {}, this.mapList[mapId - 1]) || null;
        }

        /**
         * 根据入口编号获取对应入口的简介
         * @param {Number} eId 入口编号 1-3
         */
        getEntraceInfo (eId) {
            return extend(true, {}, this.entraceData[eId - 1]) || null;
        }

        /**
         * 根据用户的段位等级获取对应段位的数据
         * @param {Number} level 段位等级
         */
        getUserGrade (level) {
            return extend(true, {}, this.userGrade[level - 1]) || null;
        }

        /**
         * 根据用户等级获取对应等级的信息
         * @param {Number} level 用户等级
         */
        getUserLevel (level) {
            return extend(true, {}, this.userLevel[level - 1]) || null;
        }

        getUserFrame () {
            return extend(true, {}, this.userFrame) || null;
        }

        getUserIcon () {
            return extend(true, {}, this.userIcon) || null;
        }
        
        getAttachment () {
            return extend(true, {}, this.attachment) || null;
        }
    }

    Sail.class(Data, "Sail.Store");
}